#ifndef PERCEPTRON_H_
#define PERCEPTRON_H_

#include <string>
#include <iostream>
#include <sys/time.h>

#include "Activation.h"
#include "Learning.h"
#include "Neuron.h"
#include "DataSet.h"
#include "CSVFile.h"
#include "time.h"

using namespace std;

// Classe que representa um perceptron
class Perceptron
{

public:

    // Carrega um perceptron salvo no arquivo passado
    Perceptron(const char *file);
    // Constrói um perceptron passando o nº de variávies de entrada, de saída e a taxa de aprendizado */
    Perceptron(uint nInVars, uint nOutVars, double learningRate);

    virtual ~Perceptron();

    // Salva o perceptron em um arquivo
    void saveToFile(const char *file);
    // Treina o perceptron passando um conjunto de entradas e saídas
    void train(DataSet& ds, uint maxIt);
    // Testa o perceptron passando um conjunto de entradas
    void test(DataSet& ds);
    // Reseta os pesos de todos os neurônios
    void resetNeuronsWeights();

    // Imprime o perceptron
    void print();

private:

    uint nInVars;
    uint nOutVars;
    double learningRate;

    Learning *learning;
    Activation *activation;
    vector<Neuron*> neurons;

};

#endif /* PERCEPTRON_H_ */
